const cryptoJS = require('crypto-js')

/**
 * 强智科技-初版加密算法（base64）
 * @param {string} message 待加密字符串
 */
const encodeInp = (message) => {
  const keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  let output = ''
  let chr1
  let chr2
  let chr3 = ''
  let enc1
  let enc2
  let enc3
  let enc4 = ''
  let i = 0
  do {
    chr1 = message.charCodeAt(i++)
    chr2 = message.charCodeAt(i++)
    chr3 = message.charCodeAt(i++)
    enc1 = chr1 >> 2
    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4)
    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6)
    enc4 = chr3 & 63
    if (Number.isNaN(chr2)) {
      // eslint-disable-next-line no-multi-assign
      enc3 = enc4 = 64
    } else if (Number.isNaN(chr3)) {
      enc4 = 64
    }
    output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4)
    // eslint-disable-next-line no-multi-assign
    chr1 = chr2 = chr3 = ''
    // eslint-disable-next-line no-multi-assign
    enc1 = enc2 = enc3 = enc4 = ''
  } while (i < message.length)
  return output
}

/**
 * Base64 编码
 * @param {string} message 待加密字符串
 * @return {string} str
 */
const Base64 = (message) => Buffer.from(message, 'utf-8').toString('base64')

/**
 * 计算给定消息的MD5哈希值
 * @param {string} message 待加密字符串
 * @return  {string} str
 */
const MD5 = (message) => cryptoJS.MD5(message).toString()

/**
 * 计算给定消息的SHA-256哈希值
 * @param {string} message 待加密字符串
 * @return  {string} str
 */
const SHA256 = (message) => cryptoJS.SHA256(message).toString()

/**
 * 使用HMAC算法和SHA256哈希函数计算消息的哈希值
 * @param {string} message 待加密字符串
 * @return  {string} str
 */
const HmacSHA256 = (message) => cryptoJS.HmacSHA256(message).toString()

/**
 * 使用HMAC算法和SHA256哈希函数计算消息的哈希值
 * @param {string} message 待加密字符串
 * @param {string} key 密钥
 * @return  {string} str
 */
const AES = (message, key) => cryptoJS.AES.encrypt(message, key).toString()

module.exports = {
  encodeInp,
  Base64,
  MD5,
  SHA256,
  HmacSHA256,
  AES,
}
